package mobile.ui.venta;

import waba.ui.*;
import waba.fx.*;
import waba.sys.*;
import waba.util.*;
import mobile.dominio.*;
import mobile.persistencia.*;
import mobile.ui.LaAnfitriona;
import mobile.ui.cliente.NuevoCliente;
import mobile.ui.cliente.SeleccionarCliente;
import mobile.ui.cliente.VerCliente;
import moio.util.*;

public class NuevaVenta extends Container{
   public static boolean update = false;
   public static Venta estaVenta;
   Grid grilla;
   Color clrBack, clrFore;
   Edit txtCantidad, txtFecha, txtTotal, txtEntrega, txtDevuelve, txtSinCosto;
   //ScrollBar scrollCant, scrollDev, scrollSinCosto;
   int cantvend, cantdev, cantsincosto;
   boolean viendoventa = false;
   Label lblCliente, lblProxCliente, lblsaldo, lblhayventa; 
   Button btnAgregar, btnEliminar, btnAtras, btnLimpiar, btnGuardar, btnAnterior, btnSiguiente, btnSeleccionar, btnmascant, btnmenoscant, btnmasdev, btnmenosdev, btnmassincosto, btnmenossincosto;
   ComboBox cmbProductos;

   public void onStart(){
	   int xx = Settings.screenWidth / 2;

	   Container container = new Container();
	   add(container);
	   Rect r1 = getClientRect();
	   container.setRect(LEFT + 2, TOP, r1.width - 4, r1.height);
	   container.setBorderStyle(BORDER_RAISED);
	   container.setBackColor(Color.getColor(0xf0f0ff));

		/*Random aleatorio = new Random();
		  
		int pos = aleatorio.rand(1, 1000);
		  
		pos = pos > 500 ? 2 : 1;*/
	      
	   if(Parametros.getInstancia().getPosicionEntrega() == Parametros.BOTON_DESPUES  | Parametros.getInstancia().getPosicionEntrega() == 0){
		   container.add(new Label("Fecha: "), LEFT, TOP);
	
		   txtFecha = new Edit("xx/xx/xxxx");
		   container.add(txtFecha);
		   txtFecha.setRect(AFTER, SAME, 110,PREFERRED);
	
		   container.add(new Label("Entrega: "), AFTER + 10, SAME);
		   txtEntrega = new Edit("12345");
		   container.add(txtEntrega, AFTER, SAME);
	   }else{
		   
		   container.add(new Label("Entrega: "), LEFT, TOP);
		   txtEntrega = new Edit("12345");
		   container.add(txtEntrega, AFTER, SAME);
		   
		   container.add(new Label("Fecha: "),  AFTER + 10, SAME);
			
		   txtFecha = new Edit("xx/xx/xxxx");
		   container.add(txtFecha);
		   txtFecha.setRect(AFTER, SAME, 110,PREFERRED);

	   }
	   txtFecha.setMode(Edit.DATE);
	   txtFecha.setText(new Date().toString());
	   txtEntrega.setMode(Edit.CURRENCY);
	   txtEntrega.setText("0");
	   
	   if (Parametros.getInstancia().getPosicionBotones() == Parametros.BOTON_ANTES  | Parametros.getInstancia().getPosicionBotones() == 0){
		   btnAnterior = new Button(" <-  ");
		   container.add(btnAnterior, LEFT, AFTER + 4);
		   btnSiguiente = new Button("  -> ");
		   container.add(btnSiguiente, AFTER, SAME);
		   
		   container.add(new Label("Clite: "), AFTER + 2, SAME);
	   }else{
		   container.add(new Label("Clite: "), LEFT, AFTER + 4);
	   }

	   lblCliente = new Label("Oscar Rostagnol     ");
	   container.add(lblCliente);
	   lblCliente.setRect(AFTER, SAME, PREFERRED, PREFERRED);
	   lblCliente.setBackColor(Color.WHITE);
	   lblCliente.setText("");

	   lblhayventa = new Label("  ");
	   container.add(lblhayventa);
	   lblhayventa.setRect(AFTER, SAME, PREFERRED, PREFERRED);
	   lblhayventa.setBackColor(Color.BLUE);
	   lblhayventa.setText(" ");
	   
	   btnSeleccionar = new Button("...");
	   container.add(btnSeleccionar, AFTER + 2, SAME);
   
	   if (Parametros.getInstancia().getPosicionBotones() == Parametros.BOTON_DESPUES){
		   btnAnterior = new Button(" <-  ");
		   container.add(btnAnterior, AFTER + 2, SAME);
		   btnSiguiente = new Button("  -> ");
		   container.add(btnSiguiente, AFTER + 2, SAME);
	   }
	   
	   Rect r2 = btnSiguiente.getRect();
	   container.setRect(LEFT + 2, TOP + 2, r1.width - 4, r2.y2() + 4);

	   xx = Settings.screenWidth / 5;
	   cmbProductos = new ComboBox(PProducto.instance.todosLosProductos().toArray());
	   add(new Label("Productos: "), LEFT + 2, AFTER + 4);
	   add(cmbProductos);
	   cmbProductos.setRect(AFTER, SAME, PREFERRED + xx, PREFERRED);

	   
	   String[] gridCaptions = { "Cod.", "Producto", "Cant", "Precio", "Dev", "S.C"};
	   int[] gridWidths = { 
			   fm.getTextWidth("xx"),
			   fm.getTextWidth("xxxxxxxxxxx"), 
			   fm.getTextWidth("12"),
			   fm.getTextWidth("xxx"),
			   fm.getTextWidth("xx"),
			   fm.getTextWidth("xx")
			   };

	   int[] gridAligns = { LEFT, LEFT, LEFT, LEFT, LEFT, LEFT };

	   grilla = new Grid(gridCaptions, gridWidths, gridAligns, false);
	   add(grilla);
	   grilla.verticalLineStyle = Grid.VERT_DOT;
	   
	   if(Parametros.getInstancia().getPosicionGrilla() == Parametros.GRILLA_ARRIBA | Parametros.getInstancia().getPosicionGrilla() == 0){
		   grilla.setRect(LEFT + 2, AFTER + 5, FILL, 70 , cmbProductos);
	   }
	   
	   Label SC = new Label("SC");
	   add(SC, LEFT + 2, AFTER + 35);
	   txtSinCosto = new Edit("2");
	   add(txtSinCosto);
	   txtSinCosto.setRect(AFTER, SAME, txtSinCosto.getPreferredWidth(), txtSinCosto.getPreferredHeight());
	   
	   btnmassincosto = new Button("+");
	   add(btnmassincosto);
	   btnmassincosto.setRect(AFTER + 2, SAME - 30, btnmassincosto.getPreferredWidth(),65);

	   btnmenossincosto = new Button("-");
	   add(btnmenossincosto);
	   btnmenossincosto.setRect(AFTER + 1, SAME, btnmenossincosto.getPreferredWidth(),65);
	   
	   btnmassincosto.setBackColor(Color.RED);
	   btnmassincosto.setForeColor(Color.WHITE);
	   btnmenossincosto.setBackColor(Color.RED);
	   btnmenossincosto.setForeColor(Color.WHITE);
	   
	   add(new Label("De"), AFTER + 2, SAME + 30);
	   txtDevuelve = new Edit("12");
	   add(txtDevuelve);
	   txtDevuelve.setRect(AFTER, SAME, txtDevuelve.getPreferredWidth(), txtDevuelve.getPreferredHeight());
   
	   btnmasdev = new Button("+");
	   add(btnmasdev);
	   btnmasdev.setRect(AFTER + 2, SAME - 30, btnmasdev.getPreferredWidth(),65);

	   btnmenosdev = new Button("-");
	   add(btnmenosdev);
	   btnmenosdev.setRect(AFTER + 1, SAME, btnmenosdev.getPreferredWidth(),65);
	   
	   btnmasdev.setBackColor(Color.RED);
	   btnmasdev.setForeColor(Color.WHITE);
	   btnmenosdev.setBackColor(Color.RED);
	   btnmenosdev.setForeColor(Color.WHITE);
	   
	   add(new Label("Can"), AFTER + 2, SAME +30);
	   txtCantidad = new Edit("12");
	   add(txtCantidad);
	   txtCantidad.setRect(AFTER, SAME, txtCantidad.getPreferredWidth(), txtCantidad.getPreferredHeight());

	   btnmascant = new Button(" +  ");
	   add(btnmascant);
	   btnmascant.setRect(AFTER + 2, SAME -30, btnmascant.getPreferredWidth(),65);

	   btnmenoscant = new Button("- ");
	   add(btnmenoscant);
	   btnmenoscant.setRect(AFTER + 1, SAME, btnmenoscant.getPreferredWidth(),65);
	   
	   btnmascant.setBackColor(Color.RED);
	   btnmascant.setForeColor(Color.WHITE);
	   btnmenoscant.setBackColor(Color.RED);
	   btnmenoscant.setForeColor(Color.WHITE);
	   
	   btnAgregar = new Button(" +  ");
	   add(btnAgregar);
	   btnAgregar.setRect(AFTER + 1, SAME, btnAgregar.getPreferredWidth(),65);

	   btnEliminar = new Button("- ");
	   add(btnEliminar);
	   btnEliminar.setRect(AFTER + 1, SAME, btnEliminar.getPreferredWidth(),65);

	   if( update ){
		   btnGuardar = new Button("  Modificar  ");
	   }else{
		   btnGuardar = new Button("    Guardar    ");
	   }

	   Label titproxcli = new Label("Prox. Cliente: ");
	   add(titproxcli);
	   titproxcli.setRect(LEFT + 2, BOTTOM - 1, PREFERRED,PREFERRED);

	   lblProxCliente = new Label("xxxxxxxxx xxxxxxxxxxx xxx");
	   add(lblProxCliente);
	   lblProxCliente.setRect(AFTER + 4, SAME, PREFERRED,PREFERRED);
	   lblProxCliente.setText("");
	   
	   if (Parametros.getInstancia().getPosicionGuardar() == Parametros.BOTON_ANTES  | Parametros.getInstancia().getPosicionGuardar() == 0){
		   add(btnGuardar);
		   btnGuardar.setRect(RIGHT - 1, BEFORE, 170,PREFERRED);
		   	   
	       btnAtras = new Button("Cancelar");
	       add(btnAtras, BEFORE - 2, SAME, btnGuardar);
	
	       /*btnLimpiar = new Button("Limp");
	       add(btnLimpiar, BEFORE - 2, SAME);*/
	       Button.commonGap = 0;
	
		   Label lbltitsaldo = new Label("Saldo: ");
		   add(lbltitsaldo);
		   lbltitsaldo.setRect(LEFT + 2, BEFORE - 2, PREFERRED,PREFERRED);
		   
		   lblsaldo = new Label("xxxxxxxxxxxxx");
		   add(lblsaldo);
		   lblsaldo.setRect(AFTER + 2, SAME, PREFERRED,PREFERRED);
		   lblsaldo.setForeColor(Color.GREEN);
		   
		   /*if( estaVenta == null ){
			   estaVenta = new Venta();
			   this.actualizoCliente(PCliente.instance.buscarSiguienteCliente(0));
		   }*/
		  
		  txtTotal = new Edit("123456");
		  add(txtTotal, LEFT + 3, AFTER + 2);
		  txtTotal.setEditable(false);
	   }else{

	       /*btnLimpiar = new Button("Limp");
	       add(btnLimpiar, BEFORE - 2, SAME);*/
	       Button.commonGap = 0;
	
		   Label lbltitsaldo = new Label("Saldo: ");
		   add(lbltitsaldo);
		   lbltitsaldo.setRect(LEFT + 2, BEFORE - 2, PREFERRED,PREFERRED);
		   
		   lblsaldo = new Label("xxxxxxxxxxxxx");
		   add(lblsaldo);
		   lblsaldo.setRect(AFTER + 2, SAME, PREFERRED,PREFERRED);
		   lblsaldo.setForeColor(Color.GREEN);
		   
		   /*if( estaVenta == null ){
			   estaVenta = new Venta();
			   this.actualizoCliente(PCliente.instance.buscarSiguienteCliente(0));
		   }*/
		  
		   add(btnGuardar);
		   btnGuardar.setRect(RIGHT - 1, BEFORE, 170,PREFERRED);
		   	   
	       btnAtras = new Button("Cancelar");
	       add(btnAtras, BEFORE - 2, SAME, btnGuardar);
	       
		  txtTotal = new Edit("123456");
		  //add(txtTotal, LEFT + 3, AFTER + 2);
		  add(txtTotal, LEFT + 3, SAME);
		  txtTotal.setEditable(false);
	   }
	   
	   if( estaVenta == null ){
		   estaVenta = new Venta();
		   this.actualizoCliente(PCliente.instance.buscarSiguienteCliente(0));
	   }
	   
	   if(Parametros.getInstancia().getPosicionGrilla() == Parametros.GRILLA_ABAJO){
		   grilla.setRect(LEFT + 2, 160, FILL, 70 , lblsaldo);
	   }
      
      if (Settings.isColor){
         Color clrBack = LaAnfitriona.defaultBackColor;
         Color clrFore = LaAnfitriona.defaultForeColor;
         btnAtras.setBackColor(clrBack);
         btnAtras.setForeColor(clrFore);
         //btnLimpiar.setBackColor(clrBack);
         //btnLimpiar.setForeColor(clrFore);
         btnAgregar.setBackColor(clrBack);
         btnAgregar.setForeColor(clrFore);
         btnEliminar.setBackColor(clrBack);
         btnEliminar.setForeColor(clrFore);
         btnGuardar.setBackColor(clrBack);
         btnGuardar.setForeColor(clrFore);
         txtTotal.setBackColor(Color.DARK);
         grilla.setBackColor(Color.WHITE);
         container.setBackColor(Color.getColor(0xf0f0ff));
      }

      Button.commonGap = 0;
      upDate( update );
   }
   

   public void upDate(boolean fillGrid){
	   if (estaVenta != null && update){
		   grilla.clear();
		   lblCliente.setText(estaVenta.getCliente().getNombre());
		   txtFecha.setText(estaVenta.getFecha().toString());
		   txtEntrega.setText(Convert.toString(estaVenta.getEntrega()));
		   
		   estaVenta.getColLineas().clear();
		   PLineaVenta.instance.lineaVentaXVenta(estaVenta);

		   lblCliente.setText(estaVenta.getCliente().getNombre());
		   
		   btnAgregar.setText("+");
		   btnAtras.setText("Cancelar");

		   txtTotal.setText(Convert.toString(estaVenta.getTotal()));
	   }

	   if (fillGrid){
		   fillGrid();
	   }
      cmbProductos.select(cmbProductos.size() - 1);
   }
   
   /**
    * Clean this window, clear the products and quantity vectors, rewinds the grid, re-set
    * the date, select index 0 of both client and product combobox, and re-set the current
    * order number.
    */
   public void clean(){
      grilla.clear();
      txtFecha.setText(new Date().toString());
      txtCantidad.setText("0");
      txtEntrega.setText("0");
      txtDevuelve.setText("0");
      txtTotal.setText("0");
      cantsincosto = 0;
      cantvend = 0;
      cantdev = 0;
      cmbProductos.select(cmbProductos.size() - 1);
      lblCliente.setText("");
      estaVenta = new Venta();
   }

   private void fillGrid( ){
	   String[][] s = new String[estaVenta.getColLineas().size()][];

	   int i = 0;
	   Iterator it = estaVenta.getColLineas().iterator();
	   while(it.hasNext()){
		   LineaVenta unaLinea = (LineaVenta) it.next();
		   s[i] = new String[]{
				   Convert.toString(unaLinea.getProducto().getId()),
				   unaLinea.getProducto().getNombre(),
				   Convert.toString(unaLinea.getCantidadDeja()),
				   Convert.toString(unaLinea.getPrecio()),
				   Convert.toString(unaLinea.getCantidadDevuelve()),
				   Convert.toString(unaLinea.getCantidadSinCosto())
		   };
		   i++;
	   }
	   grilla.setItems(s);           
   }
   
   public void calcularTotal(){
		float total = 0;
		Iterator it = estaVenta.getColLineas().iterator();
		while(it.hasNext()){
			LineaVenta unaLinea = (LineaVenta)it.next();
			total += unaLinea.getTotlin();
		}
		estaVenta.setTotal(total);
		estaVenta.setEntrega(total);
   }
   
   public void actualizoCliente(Cliente esteCliente){
	   if (esteCliente != null && esteCliente.getNombre() != null){
		   estaVenta.setCliente(esteCliente);
		   lblCliente.setText(estaVenta.getCliente().getNombre());
		   lblsaldo.setText(Convert.toString(estaVenta.getCliente().getSaldo()));
		   Cliente siguienteCliente = PCliente.instance.buscarSiguienteCliente(estaVenta.getCliente().getOrden());
		   if (siguienteCliente != null && siguienteCliente.getNombre() != null && siguienteCliente.getId() != esteCliente.getId()){
			   lblProxCliente.setText("$" + siguienteCliente.getSaldo() + " " + siguienteCliente.getNombre());
		   }else{
			   lblProxCliente.setText("");
		   }
		   
		   if(new Date().toString().compareTo(esteCliente.getUltimacompra().toString()) == 0){
			   lblhayventa.setBackColor(Color.GREEN);
		   }else{
			   lblhayventa.setBackColor(Color.RED);
		   }
	   }
   }
   
   public void onEvent(Event e){
      switch (e.type){
         case ControlEvent.PRESSED:
            /* add a product to the order */
            if (e.target == btnAgregar){
               if (txtCantidad.getLength() == 0){
            	   return;
               }
               
               Producto unProducto;
               if (((Producto)cmbProductos.getSelectedItem()) != null){
            	   unProducto = (Producto)cmbProductos.getSelectedItem();
               }else{
            	   return;
               }
               
               boolean found = false;
               
               Iterator it = estaVenta.getColLineas().iterator();
               while (it.hasNext()){
            	   LineaVenta unaLinea = (LineaVenta)it.next();
            	   if(unaLinea.getProducto().getId() == unProducto.getId()){
            		   unaLinea.setCantidadDeja(Convert.toInt(txtCantidad.getText()));
            		   unaLinea.setCantidadDevuelve(Convert.toInt(this.txtDevuelve.getText()));
            		   unaLinea.setCantidadSinCosto(Convert.toInt(this.txtSinCosto.getText()));  
            		   found = true;
            	   }
               }
               
               if (!found){
            	   Producto elProducto = (Producto)cmbProductos.getSelectedItem();
            	   if ( elProducto == null ){
            		   return;
            	   }else{
            		   LineaVenta unaLinea = new LineaVenta();
            		   unaLinea.setCantidadDeja(Convert.toInt(txtCantidad.getText()));
            		   unaLinea.setCantidadDevuelve(Convert.toInt(this.txtDevuelve.getText()));
            		   unaLinea.setCantidadSinCosto(Convert.toInt(this.txtSinCosto.getText())); 
            		   unaLinea.setProducto(elProducto);
            		   if(estaVenta.getCliente().usarPrecioEspecial() == true){
                		   unaLinea.setPrecio(unaLinea.getProducto().getPrecioEspecial());
            		   }else{
                		   unaLinea.setPrecio(unaLinea.getProducto().getPrecio());
            		   }
            		   estaVenta.getColLineas().add(unaLinea);
            	   }
               }
               
               calcularTotal();
               txtTotal.setText(Convert.toString(estaVenta.getTotal()));
               txtEntrega.setText(Convert.toString(estaVenta.getEntrega()));
               txtCantidad.setText(Convert.toString(0));
               txtDevuelve.setText(Convert.toString(0));
               txtSinCosto.setText(Convert.toString(0));
               cantsincosto = 0;
               cantvend = 0;
               cantdev = 0;
               fillGrid();
               
          /*} else if (e.target == btnLimpiar) {
               clean();*/
            }else if (e.target == btnAtras){
               clean();
               if( update){
                  LaAnfitriona.swapTo(LaAnfitriona.BUSCARVENTA);
               }else{
            	   LaAnfitriona.swapTo(LaAnfitriona.MENUVENTAS);
               }
               
               if ( update ) update = false;
               
            }else if(e.target == btnEliminar){
            	
            	Producto elProducto = (Producto)cmbProductos.getSelectedItem();
                Iterator it = estaVenta.getColLineas().iterator();
                while (it.hasNext()){
             	   LineaVenta unaLinea = (LineaVenta)it.next();
             	   if(unaLinea.getProducto().getId() == elProducto.getId()){
             		   estaVenta.getColLineas().remove(unaLinea);
             	   }
            	}
            	txtTotal.setText(Convert.toString(estaVenta.getTotal()));
            	fillGrid( );
            }else if(e.target == btnGuardar){

               if(update){
            	   PLineaVenta.instance.eliminarLineas(estaVenta.getId());
               }

               estaVenta.setFecha(new Date(txtFecha.getText()));
               estaVenta.setEntrega(Convert.toFloat(txtEntrega.getText()));
               estaVenta.getCliente().setUltimacompra(new Date());
               
               PVenta.instance.write(estaVenta, update);
               PCliente.instance.write(estaVenta.getCliente(), true, true);

               String []buttonArray = {"OK"};
               if (update){
            	   new MessageBox("Mensaje", "Venta Actualizada", buttonArray, 2,256).popupBlockingModal();
               }else{
            	   new MessageBox("Mensaje", "Venta Guardada", buttonArray, 2,256).popupBlockingModal();
               }

               clean();
               if (update & !viendoventa){
            	   update = false;
            	   LaAnfitriona.swapTo(LaAnfitriona.BUSCARVENTA);
               }else{
            	   this.actualizoCliente(PCliente.instance.buscarSiguienteCliente(0));
               }
               viendoventa = false;
            }else if(e.target == btnSeleccionar){
         	   lblProxCliente.setText("");
            	SeleccionarCliente frmBuscar = new SeleccionarCliente();
            	frmBuscar.popupBlockingModal();
            	if (frmBuscar.clienteSeleccionado != null){
            		this.actualizoCliente(frmBuscar.clienteSeleccionado);
            	}
            }else if(e.target == btnSiguiente){
            	if (estaVenta.getCliente()!=null){
            		this.actualizoCliente(PCliente.instance.buscarSiguienteCliente(estaVenta.getCliente().getOrden()));
            	}
            }else if(e.target == btnAnterior){
            	if (estaVenta.getCliente()!=null){
            		this.actualizoCliente(PCliente.instance.buscarAnteriorCliente(estaVenta.getCliente().getOrden()));
            	}else{
            		this.actualizoCliente(PCliente.instance.buscarAnteriorCliente(PParametros.instance.getParametroXID(1).getUltimoOrdenCliente()));
            	}
            	
            }else if(e.target == btnmascant){
            	cantvend +=1;
            	txtCantidad.setText(Convert.toString(cantvend));
            	//this.scrollDev.setValue(this.scrollCant.getValue());
            	cantdev += 1;
            	this.txtDevuelve.setText(Convert.toString(cantdev));
            	
            }else if(e.target == btnmenoscant){
            	if (cantvend > 0){
	            	cantvend -=1;
	            	txtCantidad.setText(Convert.toString(cantvend));
	            	//this.scrollDev.setValue(this.scrollCant.getValue());
	            	if (cantdev > 0){
		            	cantdev -= 1;
		            	this.txtDevuelve.setText(Convert.toString(cantdev));
	            	}
            	}
            }else if(e.target == btnmasdev){
            	cantdev += 1;
            	this.txtDevuelve.setText(Convert.toString(cantdev));
            }else if(e.target == btnmenosdev){
            	if (cantdev > 0){
	            	cantdev -= 1;
	            	this.txtDevuelve.setText(Convert.toString(cantdev));
            	}
            }else if(e.target == btnmassincosto){
            	cantsincosto += 1;
            	this.txtSinCosto.setText(Convert.toString(cantsincosto));
            }else if(e.target == btnmenossincosto){
            	if (cantsincosto > 0){
            		cantsincosto -= 1;
	            	this.txtSinCosto.setText(Convert.toString(cantsincosto));
            	}
			}
            break;
         case ControlEvent.FOCUS_OUT:
            /* correct the data inserted to the Date format */
            if (e.target == txtFecha)
            	txtFecha.setText(new Date(txtFecha.getText()).toString());
            break;
         case PenEvent.PEN_DOWN:
        	 if(e.target == lblCliente) {
            	 if (estaVenta.getCliente() != null){
            		 VerCliente verDatos = new VerCliente(estaVenta.getCliente());
            		 verDatos.popupBlockingModal();
            	 }
        	 }
      }
   }
   
   public void onAdd(){
      upDate(update);
      if (update == false){
          this.actualizoCliente(PCliente.instance.buscarSiguienteCliente(0));
          btnGuardar.setText("Guardar");
      }else{
          btnGuardar.setText("Modificar");
      }
   }
}
